<?php
declare (strict_types=1);

namespace app\admin\controller;

use addons\BuilderPlus\components\Column;
use addons\BuilderPlus\components\Edit;
use addons\BuilderPlus\components\Search;
use addons\BuilderPlus\components\Button;
use addons\BuilderPlus\facade\Table;

class Demo extends Base
{
    public function getOptions(): array
    {
        return [
            //(必须)主键
            'pk'           => 'id',
            //(必须)对应Model类
            'model'        => \app\common\model\Account::class,

            //(可选)获取数据的url，默认为getList方法，建议不要改动
            'url'          => url('getList')->build(),
            //(可选)对应验证类，只有新增时生效
            'validate'     => \app\common\model\Account::class,
            //(可选)关联方法名
            'with'         => ['user', 'take'],
            //(可选)附加字段
            'append'       => ['statusText', 'typeText'],
            //(可选)导出表格式时，最大内存限制，默认最大1024M
            'memory_limit' => '1024M',
            //(可选)表单提交时，是否包含justData数据，默认true
            'just'         => false,
            //(可选)快速定义方法，可节省代码行数，add，edit为请求的页面，其他均为post请求，对应model中的方法名
            'fast'         => [
                'add'   => 'draw/add',
                'edit'  => 'draw/edit',
                'save'  => '_save',
                'batch' => 'batch'
            ],
            //(可选)树形表格时，对应pid字段名
            'tree'         => [
                'pid' => 'pid',
            ]
        ];
    }

    public function index(): string
    {
        return Table::init($this)
            ->addColumns([
                ['id', 'ID', fn(Column $col) => $col->width(80)],
                ['images', '缩略图', fn(Column $col) => $col->lazyImage()->width(100), fn(Edit $e) => $e->images()],
                ['title', '标题', null, fn(Edit $e) => $e->require()],
                ['sort', '排序', fn(Column $col) => $col->fastSort(), fn(Edit $e) => $e->number()],
                ['create_time', '添加时间', fn(Column $col) => $col->width(140)],
                ['status', '状态', fn(Column $col) => $col->switch('开启|关闭', '1|0')->fixed('right')]
            ])
            ->addTopButtons([
                // +---------------------------
                // | 添加顶部按钮方法，由 addons\BuilderPlus\components\Button 组件驱动构建
                // +---------------------------

                /**
                 * 1.内置集成方法，无需fn定义，直接指定key即可，也可以fn重写指定参数，
                 */
                'add',  // 添加，左侧打开新抽屉，默认路由 url('add')->build()
                'deleteAll', // 批量删除，需多选，默认路由 url('deleteAll')->build()
                'batch', // 批量操作，需多选，默认路由 url('batch')->build()
                /** --------------------------------------- */

                /**
                 * 2.event触发，需fn定义，主要用于自定义按钮
                 */
                'test' => fn(Button $button) => $button
                    //自定义名称
                    ->title('自定义名称')

                    //自定义抽屉名称，打开抽屉后，左上角显示的标题，如未指定默认显示 按钮title
                    ->layerTitle('自定义抽屉名称')

                    //自定义class
                    ->class('自定义class')

                    //自定义icon
                    ->icon('自定义icon')

                    //自定义抽屉宽度
                    ->width('')

                    //自定义抽屉高度，一般无需指定
                    ->height('')

                    //自定义开启方向，l: 左侧，r:右侧
                    ->offset('')

                    //自定义url
                    ->url('自定义url')

                    //input占位符，event - prompt会用到
                    ->placeholder('')

                    //prompt层格式，event - prompt  0文本输入框  1密令输入框  2多行文本输入框
                    ->formType(1)

                    //上传URL，一般无需指定，默认upload/image
                    ->uploadUrl('')

                    //左侧打开新抽屉，默认路由 url('add')->build()
                    ->event('add')

                    //批量删除，需多选，默认路由 url('deleteAll')->build()
                    ->event('deleteAll')

                    //提交，需指定url参数
                    ->event('submit')

                    //浏览器打开新窗口，需指定url参数
                    ->event('openWin')

                    //href跳转新页面，需指定url参数
                    ->event('newPage')

                    //layer.prompt层，需多选，就是提交前需要输入一些数据，需指定url参数
                    ->event('prompt')

                    //layer.prompt层，就是提交前需要输入一些数据，
                    ->event('promptAll')

                    //批量操作，需多选，默认路由 url('batch')->build()
                    ->event('batch')

                    // 魔术方法
                    ->__call('方法名', '参数')


                    //调用自定义方法，需要在admin/js/handle.js 按格式定义好方法
                    //一旦调用自定义方法，event参数将无效
                    ->customEvent('')


            ])
            ->addRightButtons([


                'test' => fn(Button $button) => $button
                    // 其他配置同 添加顶部按钮 方法相同，这里只写出event不同，以及专享 方法


                    //右侧按钮专享：跳转额外携带参数，
                    //请指定data里相关参数，多个逗号拼接，系统会自动读取参数
                    //支持所有内置方法，跳转页面和提交均可指定
                    ->lineParam('title,desc')

                    ->event('submit') // 单独提交
                    ->event('edit') // 编辑，默认携带ID，可调用allLine方法来携带所有参数
                    ->event('od') // 打开抽屉
                    ->event('layer') // 打开新弹层
                    ->event('delete') // 单独删除
                    ->event('newPage') // href 打开新页面


                    // 魔术方法
                    ->__call('方法名', '参数')


                    //调用自定义方法，需要在admin/js/handle.js 按格式定义好方法
                    //一旦调用自定义方法，event参数将无效
                    ->customEvent('')


            ])
            ->addSearch([
                ['create_time', '添加时间', fn(Search $search) => $search->type('date')],
                ['title', '标题', fn(Search $search) => $search->condition('Like')]
            ])
            ->fetch();
    }
}